#include "BlockQueue.hpp"
#include "Task.hpp"


// 消费者
void *consumer(void *args)
{
    BlockQueue<task_t> *bq = static_cast<BlockQueue<task_t>* > (args);

    while(true)
    {
        sleep(1);
        task_t t = bq->Pop();
        t();
        std::cout << "消费了一个任务: " << std::endl;
    }
}



// 生产者
void *productor(void *args)
{
    BlockQueue<task_t> *bq = static_cast<BlockQueue<task_t>* > (args);
    while(true)
    {
        sleep(3);
        bq->Execute(Download);
    }
}





int main()
{
    BlockQueue<task_t> *bq = new BlockQueue<task_t>();

    pthread_t c[2], p[3];

    pthread_create(c, nullptr, consumer, bq);
    pthread_create(c + 1, nullptr, consumer, bq);
    pthread_create(p, nullptr, productor, bq);
    pthread_create(p + 1, nullptr, productor, bq);
    pthread_create(p + 2, nullptr, productor, bq);

    pthread_join(c[0], nullptr);
    pthread_join(c[1], nullptr);
    pthread_join(p[0], nullptr);
    pthread_join(p[1], nullptr);
    pthread_join(p[2], nullptr);

    return 0;
}












// // 消费者
// void *consumer(void *args)
// {
//     BlockQueue<Task> *bq = static_cast<BlockQueue<Task>* > (args);

//     while(true)
//     {
//         sleep(1);
//         Task t = bq->Pop();
//         t.Execute();
//         std::cout << "消费了一个任务: " << t.X() << "+" << t.Y() << "=" << t.Result()  << std::endl;
//     }
// }



// // 生产者
// void *productor(void *args)
// {
//     int x = 1;
//     int y = 1;
//     BlockQueue<Task> *bq = static_cast<BlockQueue<Task>* > (args);
//     while(true)
//     {
//         sleep(3);
//         std::cout << "生产了一个任务: " << x << "+" << y << "=?" << std::endl;
//         bq->Execute(Task(x, y));
//         x++, y++;
//     }
// }





// int main()
// {
//     BlockQueue<Task> *bq = new BlockQueue<Task>();

//     pthread_t c[2], p[3];

//     pthread_create(c, nullptr, consumer, bq);
//     pthread_create(c + 1, nullptr, consumer, bq);
//     pthread_create(p, nullptr, productor, bq);
//     pthread_create(p + 1, nullptr, productor, bq);
//     pthread_create(p + 2, nullptr, productor, bq);

//     pthread_join(c[0], nullptr);
//     pthread_join(c[1], nullptr);
//     pthread_join(p[0], nullptr);
//     pthread_join(p[1], nullptr);
//     pthread_join(p[2], nullptr);

//     return 0;
// }